ARM体系结构-在裸板下的开发、单片机
Linux系统移植-给开发板安装操作系统
Linux系统驱动编程-对内核进行扩展
    开发板
    SD卡
    电源线
    网线
    串口线
    蓝色USB线

一、嵌入式介绍
    1、什么是嵌入式系统
        嵌入到控件器的内部的软件，为特定的应用而设计的专用的计算机系统
        以应用为中心，以计算机技术为基础，软硬件可裁剪，适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

        学习嵌入式：
            参与系统的裁剪
            在此系统的基础开发应用
    2、嵌入式系统的构成
        软件
            应用程序
            功能库（Qt、madplay、libc、pthread）
            文件系统
            内核+驱动
            引导程序
        硬件
            底板（硬件接口，网卡、声卡、显卡、外设）
            核心板（SOC（CPU+内设），SDRAM，Nand
    3、嵌入式系统的演进方向
        1、以单芯片为核心，可以编程控制器存在的形式（单片机）
            没有操作系统支持、软件以汇编为主，功能单一、处理效率低、存储器小、没有外部接口
        2、以嵌入式CPU为基础、简单的操作系统为核心
            CPU种类多、通用性强、系统开销小、效率高、具有一定的拓展性和兼容性、用户体验度不高、交互不友好。
        3、以嵌入式操作系统为标志
            兼容性好、适用于不同平台、具有高度模块化及拓展性、界面化、用户交互友好
        4、万物互联
            将传感器技术、高速网络技术、人工智能、嵌入式技术综合联合在一起实现小型化、智能化、网络化、可视化、低功耗、绿色环保
            配合异构多核技术、云计算、大数据、人工智能、虚拟化技术
    4、嵌入式的开发模式
        非嵌入式的开发：A类计算机编写源代码->编译得到可执行程序->发布给A类计算机执行。
        嵌入式的开发：A类计算机编写源代码->编译得到可执行程序->发布给B类计算机执行。
        为什么需要交叉编译：主要是嵌入式的CPU比较简单，本身无法安装开发工具，有的甚至没有操作系统，所谓的交叉编译就是用高性能的
计算机为低性能的计算机开发软件。
        交叉编译的特点：必须使用专用的交叉编译工具，由于编译出的程序无法再本机执行，因此需要把程序通过特殊方法加载到目标设备上执
行（烧写）。
    5、为什么需要SD卡等辅助设备
        嵌入式设备所运行的软件（应用、库、文件系统、内核、驱动、引导程序）不会从本机上产生，它需要从其他机器上通过特殊复制SD卡上，
需要嵌入式设备从SD卡启动，来运行、调试相关软件。
        SD卡是嵌入式设备在没有安装好操作系统的情景下常用的一种调试方法。
        网络接口是安装引导程序、操作系统后常用的一种调试方法，常用的网络调试工具有TFTP、FTP、NFS。
        USB也建议进行调试，但不稳定而且对开发的计算机有特殊要求，基本不用。

二、ARM处理器介绍
    1、ARM的发展历史
        ARM的前身是艾康电脑，于1978年成立在英国剑桥。
        在1980年左右，苹果电脑开始与艾康电脑合作开发新的ARM核心。
        1995年推出全球第一款商用的RISC处理器。
            精简指令集：只集成了一些基础运算的指令。
            复杂指令集：它比精简指令集功能更强、指令更多，优点是使用汇编编程时更方便快捷，但随着高级语言的发展这个优势不复存在，
反而缺点功耗高、效率低、耗电更明显，对于嵌入式设备说这些缺点是致命的。
        1990年艾康电脑财务危机，接受苹果的投资分割出独立的子公司ARM（Advanced RISC Machine），ARM公司正式成立。
        从1991年开始推出第一款嵌入式精简指令集处理器架构。
        （时间不确定，仅供参考）
        1993年，发布ARM7
        1997年，发布ARM9
        2001年，发布ARMv6
        2002年，发布ARM11
        2004年，发布ARMv7，同时分出三个系列是：Cortex-A Cortex-R Cortex-M
        2005年，发布Cortex-A8
        2007年，发布Cortex-A9
        2010年，发布Cortex-A15
        2011年，发布ARMv8
        2012年，发布64位处理器
    2、ARM的商业模式和生态系统
        ARM之前的半导体行业，Intel、ADM、Motorola等，自己设计IC、自己生成芯片、自己销售。
        而ARM只负责设计IC，出卖自己的设计IP，自己不生产芯片，而是把IP授权给其他半导体厂商，来收取授权费。
        因此ARM不是一家半导体厂商，而是一家设计公司。
        ARM的启示：
            不要抱怨自己的劣势，劣势反而可能是机会。
            要想成功，得先学会帮助别人、成全别人。
            社会的成熟标志就是分工不断的细化。
            ARM发展的很快，也很慢。
    3、为什么选择三星
        本身使用广泛，有良好的企业应用基础。
        资料多、积累好、方便学习。
        开发板和方案商多，软硬件平台好找。
        体系很典型，适用于学习。
    4、ARM的版本号
        ARM型号命名问题
            1、ARM7和ARMv7不是一回事
            2、Cortex-A9比Cortex-A7更先推出
            3、型号很混乱，没有规律
        ARM的几种型号
            内核版本号 ARMv7
            Soc版本号 Cortex-A8
            芯片型号 S5PV210
            内核版本号和Soc版本号由ARM公司确定，芯片型号由半导体生产厂商确定。

三、开发板介绍
    九鼎创展 x210V3s 目前已经停产，阅读硬件手册
    CPU：S5PV210 1GHz
    内存：512MB/1GB DDR2
    硬盘：4GB inand
    串口：两路 RS232 接口，默认andorid2.3,WINCE使用uart0作为调试串口，android4.0和linux使用uart2作为调试串口，靠近电源接口。
    SD：2个SD卡接口，在使用 SD 卡启动时，一定要插到右侧的卡槽，否则无法从 SD 卡启动。
    LED：四路LED+1电源信号灯
    复位按钮：关机，并没有重启的功能。
    硬件开机开关：长按开机，9V直流电源
    启动配置开关：拨到最上面是SD启动，最下面是USB，拨码开关靠近纽扣电池。
    触摸屏：电阻、电容屏都支持
    WIFI：外接USB无线网卡
    网卡：有线以太网 DM9000CEP

四、开发环境搭建
    1、安装串口驱动
        右击我的电脑->管理->设备管理器->串口，查看COM编号
    2、安装串口通信工具
        安装PuTTY->串口(COM编号，速度115200)->保存会话->双击会话。
        长按开机按钮->显示字符即可。
    3、安装SD卡烧写工具
        以管理员身份运行x210_Fusing_Tool.exe，如果无法运行则安装vc2008运行库。
        单击Browse按钮，选择要烧写的文件led_image.bin，单机Add按钮，单机START按钮，出现Fusing image done提示信息则表示烧成功。
        注意：如果出现不可写的信息，问题1没有以管理员身份运行，问题2SD卡补上锁，否则就是SD卡损坏，请更换SD卡。
    4、安装ARM交叉编译器
        拷贝arm-2009q3.tar.bz2到共享目录，剪切到ubuntu主目录下，右击压缩包->解压到此处。
        重命名为arm-linux-gnu,从终端进入arm-linux-gnu/bin，执行pwd命令，拷贝路径。
        执行 sudo vi /etc/environment 打开环境变量配置文件，在PATH环境变量字符串的最前面添加路径，与后面的用':'分隔，然后保存
退出。
        在终端中执行 source /etc/environment
        执行arm-none-linux-gnueabi-gcc -v 可以查看交叉编译器的版本信息。
        注意：安装交叉编译器时以厂商提供的为准。






























为什么会用到汇编语言：
    C语言等高级语言的执行是需要一个环境的，比如：设置栈顶的指针
    初始化一些硬件环境，比如：关闭看门狗、初始化DDR
    对于性能有严苛要求的算法，比如：音视频解码器

一、ARM的体系结构
    1、ARM处理器有7种工作模式
        用户模式 执行正常的用户程序
        系统模式 操作系统专用
        快速中断 调速数据传输
        外部中断 用于处理中断
        特权模式 操作系统专用的保护域
        数据访问中止 虚拟存储
        未定义指令 遇到不支持的指令时进入此模式
        分类：
            用户模式和特权模式
            正常模式和异常模式
    2、ARM处理器的寄存器
        一共37个寄存器，正常模式下能访问17个，异常模式下能访问18个。
        r0~r7 所有模式共用，也叫未分组寄存器，一旦模式切换就要立即备份。（但由于其通用性，在异常中断所引起的处理器模式切换时，其
使用的是相同的物理寄存器，所以很容易遭到破坏。 ）
        r8~r12 除快速中断外，其他模式共用
        r13、r14 正常模式共用，其他模式有自己私有的
        r15 程序计数器，它记录着处理器要执行的下一条指令，给它赋值可以达到跳转的效果，所有模式共用
        CPSR 当前程序状态寄存器，所有模式共用
        SPSR 备份程序状态寄存器，正常模式没有此寄存器，其他模式有自己私有的

二、流水线
    通过合理安排硬件的分工来达到提高执行速度的效果，硬件本身的计算速度并没有提高。
    互锁和跳转会影响流水线的速度。

三、ARM的寻址方式
    立即寻址       ADD R0,R0,#1 <=> R0 += 1
    寄存器寻址     add r0,r0,r1 <=> r0 += r1
    寄存器间接寻址 ADD R0,R1,[R2] <=> R0 = R1 + *R2
    寄存器偏移寻址 add R0,R0,R2,LSL #3 <=> R0 = R0 + R2 << 3
    基址变址寻址   ADD R0,R0,[R1,#4] <=> R0 = R0 + *(R1+4)
    多寄存器寻址
        LDMIA R0,{R1,R2,R3,R4}
            R1 = *(R0+0)
            R2 = *(R0+4)
            R3 = *(R0+8)
            R4 = *(R0+12)
        STMIA R0,{R3‐R5,R10}
            *(R0+0) = R3
            *(R0+4) = R4
            *(R0+8) = R5
            *(R0+12) = R10
    堆栈寻址
        满堆栈：
        空堆栈：
        

四、ARM指令集
五、Thumb指令
六、ARM伪指令